package Day6;

import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
/**
 * 2020JavaB真题:作物杂交
 * https://www.lanqiao.cn/problems/506/learning/
 */
public class Main1 {
    static int n, m, k, t;
    //种植时间、初始作物种类、杂交所需的时间、植物是否已经合成、记录各类物种合成所需的最短时间
    static int[] time, staSeed, maxTime, visited, res;
    static int[][] hyb;//杂交途径
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        n = scan.nextInt();
        m = scan.nextInt();
        k = scan.nextInt();
        t = scan.nextInt();
        time = new int[n + 1];
        res = new int[n + 1];
        for(int i = 1; i <= n; i++){
          time[i] = scan.nextInt();
        }
        staSeed = new int[m];
        maxTime = new int[k];
        visited = new int[n + 1];
        for(int i = 0; i < m; i++){
          staSeed[i] = scan.nextInt();
          visited[staSeed[i]] = 1;//将初始给出的种子设置为已合成
        }
        
        //存储合成每个种子的方式
        hyb = new int[k][3];
        for(int i = 0; i < k; i++){
          hyb[i][0] = scan.nextInt();
          hyb[i][1] = scan.nextInt();
          hyb[i][2] = scan.nextInt();
          //计算合成种子的时间
          maxTime[i] = Math.max(time[hyb[i][0]] , time[hyb[i][1]]);
        }

        System.out.println(dfs(t));
        scan.close();
    }

    public static int dfs(int t){
      //判断此时的种子是否合成过了
      if(visited[t] == 0){
        //没有合成过，计算要合成这个种子的最小时间
        int min = Integer.MAX_VALUE;
        //找到要合成这个种子的方式
        for(int i = 0; i < k; i++){
          if(hyb[i][2] == t){
            //合成这个种子的最小时间 = 合成这个种子的时间，加上合成这个种子，所需的原料的最大时间
            min = Math.min(min , (maxTime[i] + Math.max(dfs(hyb[i][0]) , dfs(hyb[i][1]))));
          }
        }
        //标记这个种子已经合成了
        visited[t] = 1;
        //记录合成的时间
        res[t] = min;
        return min;

      }else{//合成过了直接返回合成后的结果
        return res[t];
      }
    }
}